热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

传统|保姆_玩转Rabbitmq系列01:一文带你敲响Rabbitmq的大门

篇首语:本文由编程笔记#小编为大家整理,主要介绍了玩转Rabbitmq系列01:一文带你敲响Rabbitmq的大门相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了玩转Rabbitmq系列01:一文带你敲响Rabbitmq的大门相关的知识,希望对你有一定的参考价值。





🏠个人主页:啊陈晓


🎉学习方向:java后端开发


🎁我的上一篇文章:手把手带你搭建第一个SpringCloud项目(二)


💕如果我的文章对你有帮助,点赞收藏留言都是对我最大的动力




【玩转Rabbitmq系列】文章直通车~

【玩转Rabbitmq系列】01:一文带你敲响Rabbitmq的大门

【玩转Rabbitmq系列】02:Rabbitmq保姆级安装教程与基本消息模型实战


  未完待续.........





现在让我们正式开启进入今天的正文




文章目录


  • 前言

  • 一、什么是Rabbitmq

  • 二、为什么我们要使用消息中间件

  • 三、选择Rabbitmq的原因

  • 四、Rabbitmq的四大核心概念

  • 五、Rabbitmq的六大消息模型

  • 总结





前言

  在学习任何技术之前,我们都必须要先了解这门技术的用处、选择这门技术的原因、能给自己带来什么样的帮助,这样学习起来才会更有动力。而今天,在我们正式开始学习Rabbitmq这门技术之前,我们不妨先来了解一下什么是Rabbitmq,我们又为什么选择它。







一、什么是Rabbitmq


Rabbitmq是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,用于软件之间的通信,是当前最主流的消息中间件之一



说到这里,大家可能又会问了,Rabbitmq的本质是一个消息中间件,那什么又是消息中间件呢? 



消息中间件就是利用高效可靠的消息传递机制进行异步的数据传输,并基于数据通信进行分布式系统的集成。通过提供消息队列模型和消息传递机制,可以在分布式环境下扩展进程间的通信。



人话:应用之间的一个组件,应用双方通过这个消息组件进行通信。



就如下图所示,P、C之间中间是使用Rabbitmq来实现消息的传递、实现通信。





二、为什么我们要使用消息中间件

在现实的场景和应用中,我们使用消息中间件,主要是为了解决下面的这三个问题:



1.应用解耦 



当今微服务架构盛行,一个应用从传统的应用巨石被拆分成多个微服务,在这个由众多系统构成的应用中,如果采用传统的消息传递方式,则会导致系统之间高度耦合,严重影响系统的开发和维护效率。

举个例子:假设A有一份应用的核心数据,B、C、D、E在需要数据时都必须对A发起请求,如果系统的数量不多,那A可以通过接口直接将数据传递给各个系统。但是如果系统的数量进一步增加,A还要一个个将系统传递给几十甚至成百上千个系统吗?如果其中系统中有一个瘫痪、抛出异常,因为高度耦合的关系我们是不是也要去检查A中的业务逻辑?这在实际开发中将严重影响到我们的开发效率系统性能





为了解决这个问题,我们便引入消息中间件MQ



 如下图所示,我们在A和其他系统中引入消息中间件MQ,A将最核心的数据发送给消息中间件。其他系统通过MQ来实现对核心数据的访问,即使系统数量发生变动也不会影响到A的业务逻辑,实现了系统的解耦。







2.流量消峰 



还是举个例子:如果一个订单系统在一段时间内最高只能处理一万笔订单,在正常时间段处理各种下单业务绰绰有余。但是在高峰期的时候,订单的数量来到了两万笔,此时系统便处理不了,只能去限制超过一万订单的数量不能下单。这会严重影响到系统的可用性,降低用户体验。






我们也可以通过引入MQ的方式解决上述问题



 如下图所示,我们加入消息中间件对20000个请求进行缓冲,把订单分散成一段时间进行处理。这样有一些用户可能会等待一小段时间,但是这远比系统不可用的体验感要好得多








3.异步处理



在传统的业务逻辑中,业务之间的调用通常是顺序性,在这种情况下,即使业务之间的调用所消耗的时间很短,但是因为业务太多也会导致整个业务逻辑时间执行下来花费太多的时间。

举个例子:我们在系统中发起一个请求时时,需要经历如下图所示的业务链:





因为业务链是顺序执行的,所以执行完成共花费20ms.但是在一些复杂的业务系统中,所需要付出的代价就远远不止20ms了,因此我们必须找出更好的方案来减少整个业务完成的时间。




对于上述的问题,我们还是可以通过引入消息中间件来解决。



 如下图所示,我们以业务2、业务3为例,让他们先将消息发送到消息中间件中,后业务2、业务3下的其他业务再通过消息中间件来获取对应的消息,让业务3不必等到业务2完全执行完再执行,通过消息中间件实现了业务之间的异步处理。这便极大程度上缩短了业务的执行时间,提高了系统的可用性。








三、选择Rabbitmq的原因

在现在的市场上,有很多消息中间件的技术,为什么我们选择了Rabbitmq?



常见的消息中间件 


那是因为Rabbitmq具有下面的特性:



  • 遵循AMQP协议
  • 可靠性高,消息持久化能够能保证消息的稳定性
  • 集群部署简单,应用Erlang使得RabbitMQ集群部署变的超级简单
  • WEB管理和监控,为后期运维提供很大的便利
  • 功能丰富,支持消息持久化、支持消息确认机制、灵活的任务分发机
  • 大量成功的应用案例,例如阿里、网易等互联网巨头都有使用。

基于以上的特性,对于市面上绝大多数中小型公司中数据量没有很大的项目来说。功能完备的Rabbitmq是一个非常好的选择。




四、Rabbitmq的四大核心概念

简单点来说,Rabbitmq其实就像一个快递站点,不过他所传递的是消息而并非快递,接下来我们就以快递站点为例子引出Rabbitmq的四大核心概念。



在Rabbitmq中,有着以下四大核心概念:



  •  生产者(producer)




生产者是产生数据发送消息的程序


  • 交换机(exchange)




交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定


  • 队列(queue)





队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式



  • 消费者(consumer)





消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费 者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。




简单来说,拿快递站点来比喻,生产者即是商家,由商家(生产者)发出快递(信息),然后由快递站(交换机)接收,快递站(交换机)必须知道快递(信息)是发往那条运行通道(队列),最终快递(消息)通过运行通道(队列)到达用户(消费者)手中。




五、Rabbitmq的六大消息模型

1、基本消息模型



即一个消费端(C)接收一个生产端(P)发送在消息队列(图中红色部分)中的信息。




2 、work消息模型



即两个消费端(C1)、(C2)共同消费一个生产端(P)发送在同一个消息队列(图中红色部分)中的信息,但是一个消息只能被一个消费者获取,C1、C2之间是竞争关系。




  3、Publish/subscribe模式




生产者(P)将消息发送到交换机(X)中,此处的交换机是Fanout(广播类型),交换机将消息广播发送给两个消息队列(图中两个红色部分),然后消费者C1、C2再分别从对应的队列中获取消息。




  4、Routing 路由模型



生产者(P)带着routing-key的消息发送到交换机(X)中,此处的交换机是direct(直接类型),交换机将消息中routing-key队列中所带的routing-key进行匹配,即图中的error、info、warning,匹配成功则将消息发送给对应的消息队列(图中两个红色部分),然后消费者C1、C2再分别从对应的队列中获取消息。




  5、Topics 通配符模式



生产者(P)带着routing-key的消息发送到交换机(X)中,此处的交换机是topic(主题模式),交换机将消息中routing-key队列中所带的通配符进行匹配,即图中的*.orange.*、*.*.rabbit、lazy.#,匹配成功则将消息发送给对应的消息队列(图中两个红色部分),然后消费者C1、C2再分别从对应的队列中获取消息。



通配符规则: 



#:匹配0个或多个词


*:匹配1个词



例子:


*.orange.*:成功:a.orange.b、ok.orange.ok1      失败:a.orange.b.c 、orange.b


 azy.#:成功:azy、azy.a、azy.b.c  失败:a.azy




  6、RPC



  1. 客户端(P)启动时,会创建一个匿名独享的回调队列(amqp.gen-Xa2)
  2. 客户端(P)为RPC请求设置2个属性:replyTo(用于设置回调队列名字);correlationId(用于标记request)
  3. 请求被发送到rpc_queue队列
  4. RPC服务器端(S)监听rpc_queue队列中的请求,当请求到来时,RPC服务器端(S)会处理并且把带有结果的消息发送给客户端(P)接收的队列就是replyTo设定的回调队列。
  5. 客户端(P)监听回调队列(amqp.gen-Xa2),当有消息时,检查correlationId属性,如果与request中匹配,即取出结果




总结

  看到这里,相信你已经对Rabbitmq有了一个初步的了解,也许你还存在一些没有特别理解的地方,没关系,在接下的系列文章里,我将从简单到复杂,从配置到实现一步步带你深入Rabiitmq的世界!!



至此,我们今天的教程就到此结束啦~


感谢您的阅读,希望我的文章能给你带来帮助!!!





推荐阅读
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • SpringCloud电商平台开发指南:实战案例解析
    本文详细介绍了基于SpringCloud构建的电商平台项目,涵盖了从技术选型到项目部署的全流程,旨在帮助开发者快速掌握电商平台的开发技巧。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 该平台旨在为大型企业提供一个高效、灵活且可扩展的分布式微服务架构解决方案。它采用模块化、微服务化和热部署的设计理念,结合当前最先进且无商业限制的主流开源技术,如Spring Cloud、Spring Boot2、MyBatis、OAuth2和Element UI,实现前后端分离的系统管理平台。 ... [详细]
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • 最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品ling取参考你的选题刚好在下面有,有时间看到机会给您发1ssm资源循环利用2springboot校园考勤系统3ssm防 ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
author-avatar
Tina19Or多多
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有